package homework.day09;

import java.util.Arrays;

/**
 * @author ThinkBook
 */
public class MyArrayList {
    // 定义数组容器
    private Object[] elementData;
    // 默认容量为10
    private static final int DEFAULT_CAPACITY = 10;
    // 实际ArrayList的大小
    private int size;
    // 提供有参构造器 自定义初始容量
    public MyArrayList(int initialCapacity) {
        if (initialCapacity < 0) {
            throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
        }
        this.elementData = new Object[initialCapacity];
    }
    // 无参构造初始化 将默认10传递给有参构造器
    public MyArrayList() {
        this(DEFAULT_CAPACITY);
    }
    // 在尾部添加元素
    public void add(Object object) {
// 1.判断实际存放的数组容量是否大于elementData.length
        if (size == elementData.length) {
// //最小传一个比当前容量大的值给他扩容
            grow(size + 1);
        }
// 2.使用下标进行赋值
        elementData[size++] = object;
    }
    // 在指定位置添加元素
    public void add(int index, Object object) {
        rangeCheckForAdd(index);
        if (size == elementData.length) {
// 最小传一个比当前容量大的值给他扩容
            grow(size + 1);
        }
// size-index 从当前值和后面的值往后移动，多了一个值，所以不需要-1
        System.arraycopy(elementData, index, elementData, index + 1, size - index); // 1 2 3 4 5
        elementData[index] = object;
        size++;
    }
    // 获取指定索引元素
    public Object get(int index) {
        rangeCheckForAdd(index);
        return elementData[index];
    }
    // 检查数组是否越界
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            throw new ArrayIndexOutOfBoundsException("数组越界异常");
        }
    }
    // 删除指定索引元素
    public Object remove(int index) {
        rangeCheckForAdd(index);
        Object old = elementData[index];
// 移动元素位置 并且将最后一位置空
// 算出需要移动的个数
        int numMoved = size - index - 1;
        if (numMoved > 0)
// size-index-1 下标是少1的 而且是往前挪
            System.arraycopy(elementData, index + 1, elementData,
                    index, numMoved);
// 注意numMoved的判断，如果是删除最后一个元素，虽然不移动也必须置空
        elementData[--size] = null;
        return old;
    }
    // 删除对象
    public boolean remove(Object o) {
        for (int i = 0; i < size; i++) {
            if (o.equals(elementData[i])) {
                remove(i);
                return true;
            }
        }
        return false;
    }
    // 清空数据
    public void clear() {
        for (int i = 0; i < size; i++) {
            elementData[i] = null;
        }
        size = 0;
    }
    // 扩容
    private void grow(int minCapacity) {
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0) newCapacity =
                minCapacity;
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    // 测试
    public static void main(String[] args) {
        MyArrayList my = new MyArrayList(1);
        my.add(1);
        my.add(2);
        my.add(3);
        System.out.println("获取第一个位置" + my.get(1));
        my.remove(1);
        my.clear();
        System.out.println(my.size);
    }

}

